package com.yupi.yupicturebackend.manager;

import cn.hutool.core.io.FileUtil;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.model.COSObject;
import com.qcloud.cos.model.GetObjectRequest;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.model.ciModel.persistence.PicOperations;
import com.yupi.yupicturebackend.config.CosClientConfig;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 提供通用的对象存储操作，比如文件上传、文件下载等。
 * 该类需要引入对象存储配置和COS客户端，用于和COS进行交互。
 */
@Component // 标识这是一个Spring管理的组件，允许自动装配到Spring上下文中。
public class CosManager {

    @Resource // 自动注入依赖，从Spring上下文中查找并注入匹配的bean。
    private CosClientConfig cosClientConfig; // 对象存储配置类，包含bucket名称等信息。

    @Resource // 自动注入依赖，从Spring上下文中查找并注入匹配的bean。
    private COSClient cosClient; // 腾讯云COS客户端实例，用于执行各种COS操作。

    /**
     * 上传对象到指定的bucket中。
     *
     * @param key  文件在bucket中的唯一键值。
     * @param file 要上传的文件。
     * @return 返回一个PutObjectResult对象，包含上传结果信息。
     */
    public PutObjectResult putObject(String key, File file) {
        // 创建一个PutObjectRequest对象，指定bucket名、对象key和要上传的文件。
        PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucket(), key, file);
        // 执行上传操作，并返回上传结果。
        return cosClient.putObject(putObjectRequest);
    }

    /**
     * 从指定的bucket中下载对象。
     *
     * @param key 文件在bucket中的唯一键值。
     * @return 返回一个COSObject对象，包含下载的数据流和其他元数据。
     */
    public COSObject getObject(String key) {
        // 创建一个GetObjectRequest对象，指定bucket名和要下载的对象key。
        GetObjectRequest getObjectRequest = new GetObjectRequest(cosClientConfig.getBucket(), key);
        // 执行下载操作，并返回下载结果。
        return cosClient.getObject(getObjectRequest);
    }

    /**
     * 上传图片对象，并对图片进行基本的信息获取处理。
     *
     * 后续修改该方法，将图片后缀转为 webp，并且使用数据万象将图片格式转为 webp
     *
     * @param key  文件在bucket中的唯一键值。
     * @param file 要上传的图片文件。
     * @return 返回一个PutObjectResult对象，包含上传结果信息。
     */
    public PutObjectResult putPictureObject(String key, File file) {
        // 创建一个PutObjectRequest对象，指定bucket名、对象key和要上传的图片文件。
        PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucket(), key, file);

        // 创建一个PicOperations对象，用于设置图片处理参数。对图片进行处理（获取基本信息也被视作为一种处理）
        PicOperations picOperations = new PicOperations();

        // 设置是否返回原图信息，1表示返回原图信息。
        picOperations.setIsPicInfo(1);

        // 修改：
        List<PicOperations.Rule> rules = new ArrayList<>();

        // 修改：图片压缩 转为 webp 格式
        String webpKey = FileUtil.mainName(key) + ".webp";
        PicOperations.Rule compressRule = new PicOperations.Rule();
        compressRule.setRule("imageMogr2/format/webp");
        compressRule.setBucket(cosClientConfig.getBucket());
        compressRule.setFileId(webpKey);
        rules.add(compressRule);

        // 修改：缩略图处理
        if (file.length() > 2 * 1024) {
            PicOperations.Rule thumbnaiRule = new PicOperations.Rule();
            thumbnaiRule.setBucket(cosClientConfig.getBucket());
            String thumbnailKey = FileUtil.mainName(key) + "_thumbnail." + FileUtil.getSuffix(key);
            thumbnaiRule.setFileId(thumbnailKey);
            // 修改：缩放规则
            thumbnaiRule.setRule(String.format("imageMogr2/thumbnail/%sx%s>", 128, 128));
            rules.add(thumbnaiRule);
        }
        // 修改：构造处理参数
        picOperations.setRules(rules);

        // 将图片处理参数添加到PutObjectRequest中。
        putObjectRequest.setPicOperations(picOperations);

        // 执行上传操作，并返回上传结果。
        return cosClient.putObject(putObjectRequest);
    }

    /**
     * 删除对象
     * @param key
     * @throws CosClientException
     */
    public void deleteObject(String key) throws CosClientException {
        cosClient.deleteObject(cosClientConfig.getBucket(), key);
    }
}